<?php
    /**
     * 获取评论数据
     * 参考官网的例子：http://dev.duoshuo.com/threads/50037b11b66af78d0c000009
     * @author ubuntuvim
     * @mail 1527254027@qq.com
     */
    function sync_log() {
        $secret = '';  //  密钥后台查看
        $short_name = '';  //  申请是的二级域名
        
        //  这里有个问题，如果是按照官方例子 if (check_signature($_POST)) 无法通过
        if (!check_signature($_POST)) {  // 不用签名校验也可以，不知道是不是多说的问题
            
            $limit = 200;

            //  获取最后一次获取的log_id，每次获取之后更新 这个值
            //  设定每次获取都是升序的，所以每次获取完之后把最后一条数据更新到数据库即可（如果是降序，则获取第一天更新到数据库）
            $last_log_id = get_last_log_id();
            if (!$last_log_id)
                $last_log_id = 0;

            //  引入一个第三方库：http://requests.ryanmccue.info/  使用、下载自己去官网找
            include('Requests-1.6.0/library/Requests.php');
            Requests::register_autoloader();
            //  如果不指定$last_log_id，每次都会获取全部数据，1. 导致本地数据重复，2.数据量很大时，获取速度慢
            $url = 'http://api.duoshuo.com/log/list.json?short_name='.$short_name.'&secret='.$secret.'&limit='.$limit."&order=asc&since_id=".$last_log_id;
            $request = Requests::get($url);
            $list = json_decode($request->body)->response;
            //echo '{"msg":"111111111~~~"}';
            if (!isset($list) || count($list) <= 0) {
                //处理错误,错误消息$response['message'], $response['code']
				echo '{"msg":"没有新的数据需要同步~~~"}';
            } else {
                $flag = 0;
                $llid = 0;
                //遍历返回的response，根据action决定对这条评论的处理方式。
                foreach($list as $log){
                    if (0 != flag) {
                        //  如果出现保存数据出错，直接退出循环，记录此时的log_id
                        $llid = $log->log_id;
                        break;
                    }
                    //  全部数据都保存到自己的数据库
                    $flag = saveCommentInfo2Local($log);
//                    switch($log->action){
//                        case 'create':
//                            //这条评论是刚创建的
//                            //echo '{"msg":"save2localsuccess!"}';
//                            $flag = saveCommentInfo2Local($log);
//                            break;
//                        case 'approve':
//                            //这条评论是通过的评论
//                            break;
//                        case 'spam':
//                            //这条评论是标记垃圾的评论
//                            break;
//                        case 'delete':
//                            //这条评论是删除的评论
//                            break;
//                        case 'delete-forever':
//                            //彻底删除的评论
//                            break;
//                        default:
//                            break;
//                    }    
                }
                //更新last_log_id，记得维护last_log_id。（如update你的数据库）
                update_last_log_id(array_pop($list)->log_id);  // 把最后一个元素的log_id更新到数据库
                if (0 != $llid)
                    update_last_log_id($llid);
                
                if (0 != $flag) {  // 简单判断一下
                    echo '{"msg":"同步失败！！！"}';
                } else {
                    echo '{"msg":"同步成功！！！"}';
                }
            }
         } else {
            echo '{"msg":"GET！！！"}';
         }
    }

    function saveCommentInfo2Local($val) {
        $ret = 0;
        //`id`, `log_id`, `user_id`, `action`,  `post_id`, `thread_id`, `thread_key`, `author_id`, `author_key`, `author_name`, `author_email`, `author_url`, `ip`, `created_at`, `message`, `status`, `type`, `parent_id`, `agent`, `date`
        $mysql = new SaeMysql();
           $sql = "INSERT INTO `tp_leavemessage`(`log_id`, `user_id`, "
            ." `action`,  `post_id`, `thread_id`, `thread_key`, `author_id`, "
            ." `author_key`, `author_name`, `author_email`, `author_url`, "
            ." `ip`, `created_at`, `message`, `status`, `parent_id`, `agent`) "
            ." VALUES ('".$val->log_id."', '".$val->user_id."', '"
                .$val->action."', '".$val->meta->post_id."', '".$val->meta->thread_id."', '"
                .$val->meta->thread_key."', '".$val->meta->meta->author_id."', '".$val->meta->author_key."', '"
                .$val->meta->author_name."', '".$val->meta->author_email."', '".$val->meta->author_url."', '"
                .$val->meta->ip."', '".$val->meta->created_at."', '".$val->meta->message."', '".$val->meta->status."', '"
                .$val->meta->parent_id."', '".$val->meta->agent."' ) ";
        $mysql->runSql($sql);
        $ret = $mysql->errno();

        $mysql->closeDb();
        //exit();
        return $ret;
    }

    /**
     * 获取最后一次获取的log_id，每次获取之后更新 这个值
     * @param {Type}  
     */ 
    function get_last_log_id() {
        $ret = 0;
        $mysql = new SaeMysql();

        $sql = "SELECT * FROM `tp_duoshuo_log_id`";
        $result	=	$mysql->getData($sql);
        //  因为数据库只有一条数据，是已经初始化为0的，后面都是更新
	    foreach($result as $v) {
            $ret = $v['last_log_id'];
        }

        $mysql->closeDb();
        
        return $ret;
    }

    /**
     * 更新log_id
     * @param {Type}  
     */ 
    function update_last_log_id($val) {
       $mysql = new SaeMysql();
        $sql = "UPDATE `tp_duoshuo_log_id` SET last_log_id = ".$val;
        $mysql->runSql($sql);
        if ($mysql->errno() != 0) {
            //die("Error:" . $mysql->errmsg());
            echo '{"msg":"'.$mysql->errmsg().'"}';
        }

        $mysql->closeDb();
    }

    /**
     *
     * 检查签名
     *
     */
    function check_signature($input){
        $secret = 'xxx';  ///////////////////// 记得修改这里///////////////////////////
        $short_name = 'xxx'; ///////////////////// 记得修改这里///////////////////////////
        $last_log_id = '3';
        unset($input['signature']);
        $str = $input['signature'];
        ksort($input);
        $baseString = http_build_query($input, null, '&');
        $expectSignature = base64_encode(hmacsha1($baseString, $secret));
        if ($str !== $expectSignature) {
            return false;
        }
        return true;
    }

    // from: http://www.php.net/manual/en/function.sha1.php#39492
    // Calculate HMAC-SHA1 according to RFC2104
    // http://www.ietf.org/rfc/rfc2104.txt
    function hmacsha1($data, $key) {
        if (function_exists('hash_hmac'))
            return hash_hmac('sha1', $data, $key, true);

        $blocksize=64;
        if (strlen($key)>$blocksize)
            $key=pack('H*', sha1($key));
        $key=str_pad($key,$blocksize,chr(0x00));
        $ipad=str_repeat(chr(0x36),$blocksize);
        $opad=str_repeat(chr(0x5c),$blocksize);
        $hmac = pack(
                'H*',sha1(
                        ($key^$opad).pack(
                                'H*',sha1(
                                        ($key^$ipad).$data
                                )
                        )
                )
        );
        return $hmac;
    }

    //  执行同步
	sync_log();

?>